﻿using System;
using System.Collections.Generic;

namespace DimensionsHelper.Common.Contracts.Services;

/// <summary>
/// 报告记录信息的服务对象
/// </summary>
public interface IReportService
{

    /// <summary>
    /// 使用模板字符串记录文本，需要满足<see cref="string.Format(string, object?[])"/>函数的
    /// 格式要求。
    /// </summary>
    /// <param name="format">模板字符串</param>
    /// <param name="args">格式化参数</param>
    void Log(string format, params object?[] args);
        
    /// <summary>
    /// 使用模板字符串记录文本，需要满足<see cref="string.Format(string, object?[])"/>函数的
    /// 格式要求。
    /// </summary>
    /// <param name="level">报告级别</param>
    /// <param name="format">模板字符串</param>
    /// <param name="args">格式化参数</param>
    void Log(ReportLevel level, string format, params object?[] args);
        

    /// <summary>
    /// 使用模板字符串记录警告文本，需要满足<see cref="string.Format(string, object?[])"/>函数的
    /// 格式要求。
    /// </summary>
    /// <param name="format">模板字符串</param>
    /// <param name="args">格式化参数</param>
    void Warn(string format, params object?[] args);
        
    /// <summary>
    /// 使用模板字符串记录错误文本，需要满足<see cref="string.Format(string, object?[])"/>函数的
    /// 格式要求。
    /// </summary>
    /// <param name="format">模板字符串</param>
    /// <param name="args">格式化参数</param>
    void Error(string format, params object?[] args);

    /// <summary>
    /// 报告进度信息。
    /// </summary>
    /// <param name="progress">当前的进度值，[0, 100]区间的数是有效值</param>
    void Progress(double progress);

    /// <summary>
    /// 报告进度和模板文本信息。模板需要满足<see cref="string.Format(string, object?[])"/>函数的
    /// 格式要求。
    /// </summary>
    /// <param name="progress">当前的进度值，[0, 100]区间的数是有效值</param>
    /// <param name="format">模板字符串</param>
    /// <param name="args">格式化参数</param>
    void Progress(double progress, string format, params object?[] args);

    /// <summary>
    /// 获取一个可以报告进度的枚举器。
    /// </summary>
    /// <typeparam name="T">枚举类型</typeparam>
    /// <param name="source">数据源列表</param>
    /// <param name="length">数据源列表长度</param>
    /// <param name="messageGetter">获取进度消息的回调函数</param>
    IProgressEnumerable<T> WithProgress<T>(IEnumerable<T> source, int length, Func<T, double, string>? messageGetter);

    /// <summary>
    /// 报告一个本地路径。
    /// </summary>
    /// <param name="localDirectory">本地文件或文件夹路径</param>
    void Directory(string localDirectory);

    /// <summary>
    /// 报告一个本地路径并带有一个模板信息。模板需要满足<see cref="string.Format(string, object?[])"/>函数的
    /// 格式要求。
    /// </summary>
    /// <param name="localDirectory">本地文件或文件夹路径</param>
    /// <param name="format">模板字符串</param>
    /// <param name="args">格式化参数</param>
    void Directory(string localDirectory, string format, params object?[] args);
}